package com.example.everying.utils;/*
 * 项目名称: everything
 * 文件名: JwtUtils
 * 作者: 张泽阳
 * 日期: 2025/5/16
 * 描述:
 */

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {
    /**
     * token过期时间 一周
     */
    private static final long EXPIRE_TIME = 60 * 60 * 1000 * 24 * 7 ;
    /**
     * token秘钥
     */
    private static final String TOKEN_SECRET = "tuoyang";


    /**
     * 生成签名，30分钟过期
     * @param id 用户id
     * @return 生成的token
     */
    public static String sign(String id) {
        try {
            // 设置过期时间
            Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            // 私钥和加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            // 设置头部信息
            Map<String, Object> header = new HashMap<>(2);
            header.put("Type", "Jwt");
            header.put("alg", "HS256");

            // 返回token字符串
            return JWT.create()
                    .withHeader(header)
                    .withClaim("id",id)
                    .withExpiresAt(date)
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    /**
     * 生成签名，30分钟过期
     * @param id 用户id
     * @return 生成的token
     */
    public static String permanentSign(String id) {
        try {
            // 私钥和加密算法
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            // 设置头部信息
            Map<String, Object> header = new HashMap<>(2);
            header.put("Type", "Jwt");
            header.put("alg", "HS256");

            // 返回token字符串
            return JWT.create()
                    .withHeader(header)
                    .withClaim("id",id)
                    .sign(algorithm);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }


    /**
     * 检验token是否正确
     * @param token 需要校验的token
     * @return 校验是否成功
     */
    public static boolean verify(String token){
        try {
            //设置签名的加密算法：HMAC256
            Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
            JWTVerifier verifier = JWT.require(algorithm).build();
            DecodedJWT jwt = verifier.verify(token);
            return true;
        } catch (Exception e){
            return false;
        }
    }

    public static String  tokenParse(String token){
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("tuoyang")).build();// 创建解析对象，使用的算法和secret要与创建token时保持一致
        DecodedJWT decodedJWT = jwtVerifier.verify(token);//验证token，生成一个解析后的对象
        String id = decodedJWT.getClaim("id").asString();//获取负载里面响应的内容
        return  id;
    }

    public static void main(String[] args) {
//        System.out.println(sign("03442506061050"));
//        System.out.println(sign("76562507051001"));
        System.out.println(sign("67372507101722"));
//        System.out.println(tokenParse("eyJhbGciOiJIUzI1NiIsIlR5cGUiOiJKd3QiLCJ0eXAiOiJKV1QifQ.eyJpZCI6IjcxMjgyNTA2MTMwOTQyIiwiZXhwIjoxNzUxMjQ2NjE0fQ.Y1gtSxBHK6Jqh8tWucmE3Sqfvu6_upati95h1mhUBOk"));
//        String token = "eyJhbGciOiJIUzI1NiIsIlR5cGUiOiJKd3QiLCJ0eXAiOiJKV1QifQ.eyJpZCI6Ijk4NjIyNTA2MDUxNDQwIiwiZXhwIjoxNzQ5ODk2MjUwfQ._3Hj6KIPKJ3qrnGu1Yh9V-hDipaiSjCO3OLswENOqWA";
//        DecodedJWT decodedJWT = JWT.decode(token);
//        System.out.println("解析："+ tokenParse(token));
    }
}
